home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Diamond Collection / The Diamond Collection (Software Vault)(Digital Impact).ISO / cdr40 / x1j4_src.zip / L2E.C < prev    next >
Text File  |  1995-01-21  |  13KB  |  241 lines

  1. /**************************************************************************\
  2. *                                                                          *
  3. *                                                                          *
  4. *    *****                      *****                                      *
  5. *      *****                  *****                                        *
  6. *        *****              *****                                          *
  7. *          *****          *****                                            *
  8. *            *****      *****                                              *
  9. *              *****  *****                                                *
  10. *            *****      *****                                              *
  11. *          *****          *****          The Firmware. The Net.            *
  12. *        *****              *****        Portable. Compatible.             *
  13. *      *****                  *****      Public Domain.                    *
  14. *    *****                      *****    By NORD><LINK.                    *
  15. *                                                                          *
  16. *                                                                          *
  17. *                                                                          *
  18. *    L2E.C   -   Level 2, Teil 5                                           *
  19. *                                                                          *
  20. *                Dieser Teil ist eine Zusammenfassung der                  *
  21. *                zeitunkritischsten Funktionen und kann somit mit der      *
  22. *                groessten Platzersparnis optimiert werden.                *
  23. *                                                                          *
  24. *                                                                          *
  25. *    angelegt:      DC4OX                                                  *
  26. *    modifiziert:                                                          *
  27. *            G8KBB April 1991 - use of register keyword to reduce code     *
  28. *                               initialise L2 stats buffers if needed      *
  29. *                               add the following to l2init()              *
  30. *                                   stats, integrity checking & ACL        *
  31. *                                                                          *
  32. * September 1993 - released as TheNet X-1J                                 *
  33. *                                                                          *
  34. * Various speedups                                                         *
  35. *                                                                          *
  36. * Released as TheNet X-1J release 4, January 1995                          *
  37. \**************************************************************************/
  38.  
  39.  
  40.  
  41.  
  42.  
  43. /*                                                             Includes   */
  44. /**************************************************************************/
  45.  
  46. #include "all.h"         /* allgemeine Festlegungen                       */
  47. #include "tntyp.h"       /* Festlegungen/Datenstrukturen fuer den Level 2 */
  48. #include "l2s.h"         /* Zugriff auf die State-Tabellen                */
  49. #include "l2ext.h"       /* globale Variable / nicht int-Funktionen       */
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56. /**************************************************************************\
  57. *                                                                          *
  58. * action      :  "level 2 initialize"                                      *
  59. *                                                                          *
  60. *                Initialisieren des dynamischen Freispeichers sowie        *
  61. *                aller Level-2-spezifischer Listen- und Framekoepfe.       *
  62. *                                                                          *
  63.  **************************************************************************
  64. *                                                                          *
  65. * parameter   :  -                                                         *
  66. *                                                                          *
  67. * r/o globals :  (Routing-Table)                                           *
  68. *                                                                          *
  69. * r/w globals :  lnkpoi   - Zeiger in lnktbl                               *
  70. *                rxfl     - "leere Liste"                                  *
  71. *                monfl    - "leere Liste"                                  *
  72. *                stfl     - "leere Liste"                                  *
  73. *                trfl     - "leere Liste"                                  *
  74. *                freel    - Liste freier 32-Byte-Buffer dynam. Speicher,   *
  75. *                           jeder Buffer ist initialisiert :  mbpc, mbgc   *
  76. *                           geloescht, mbbp initialisiert, mbl             *
  77. *                           "leere Liste", Buffer der Routing-Table        *
  78. *                           werden nicht neu allokiert bei Warmstart       *
  79. *                nmblks   - 0                                              *
  80. *                nmbfre   - Anzahl freie 32-Byte-Buffer dynam. Speicher    *
  81. *                txl2fl[] - alle Listenkoepfe "leere Liste"                *
  82. *                rxfhd[]  - alle Eintrage NULL                             *
  83. *                txfhd[]  - alle Eintrage NULL                             *
  84. *                istraf[] - alle Eintrage NULL                             *
  85. *                lnktbl   - alle Linkbloecke werden initialisiert          *
  86. *                           (rcvdil, sendil, rcvd, tosend, state, srcid    *
  87. *                           loeschen, snglT1, k, N2, V2link setzen,        *
  88. *                           reslnk() wird aufgerufen)                      *
  89. *                                                                          *
  90. * locals      :  s.u.                                                      *
  91. *                                                                          *
  92. * returns     :  -                                                         *
  93. *                                                                          *
  94. \**************************************************************************/
  95.  
  96. VOID l2init()
  97.   {
  98.     register char *actbp;     /* Zeiger auf aktuellen Freibuffer          */
  99.     register char *nextbp;    /* Zeiger auf naechsten Freibuffer          */
  100.     char       *minm;         /* niedrigste nutzbare Freispeicherstelle   */
  101.     char       *maxm;         /* hoechste nutzbare Freispeicherstelle     */
  102.     register unsigned n;      /* Laufindex                                */
  103. #ifdef STATSCMD
  104.     unsigned i;               /* extra counter needed for clearing stats  */
  105. #endif
  106.  
  107.     inithd(&rxfl);            /* diverse Listenkoepfe = "leere Liste"     */
  108. #ifdef FIRMWARE
  109.     inithd(&monfl);           /* Monitor gibt es nur in Firmware          */
  110. #endif
  111.     inithd(&stfl);
  112.     inithd(&trfl);
  113.     inithd(&freel);
  114.  
  115.     nmblks = nmbfre = 0;      /* keine Links aktiv, noch keine Freibuffer */
  116.     minm = actbp = minmem();  /* niedrigste nutzbare Freispeicherstelle   */
  117.     maxm = maxmem();          /* hoechste nutzbare Freispeicherstelle     */
  118.  
  119.     while (    ((nextbp = actbp + sizeof(MB) - 1) <= maxm)
  120.             && (nextbp >= minm)
  121.           )                                  /* solange Buffer in Frei-   */
  122.       {                                      /* speicher passen, es keine */
  123.      /* Routingtablebuffer sind   */
  124.  
  125.         /* if integrity checking is enabled, use those routines in preference
  126.          * otherwise check routing tables or acl tables only
  127.          */
  128. #ifdef INTEGRITY
  129.         if( !iswarm() || !integrity( actbp ) )
  130. #else
  131. #ifdef ACL
  132.         if (!iswarm() || ( !isrout(actbp) && !isacl( actbp ) ))
  133. #else
  134.         if (!iswarm() || !isrout(actbp))
  135. #endif
  136. #endif
  137.           dealoc(actbp);                     /* oder Kaltstart, diese     */
  138.         actbp = nextbp + 1;                  /* initialisieren und in     */
  139.       }                                      /* Freispeicherliste haengen */
  140.        
  141.     for (n = 0; n < L2PNUM; ++n)             /* fuer alle Ports TX-Frame- */
  142.       {                                      /* listen "leer", RX- und    */
  143.        inithd(&txl2fl[n]);                   /* TX-Framekoepfe unbesetzt, */
  144.                                              /* noch nichts gesendet      */
  145.  
  146. #ifdef FIRMWARE
  147.        rxfhd[n] = txfhd[n] = (MBHEAD *)NULL;
  148. #else
  149.        rxfhd[n] = txfhd[n] = (MBHEAD *)(istraf[n] = (char)NULL);
  150. #endif
  151.  
  152.       }
  153.       
  154.     for (n = LINKNMBR, lnkpoi = lnktbl; n != 0; --n, ++lnkpoi)  /* Link-   */
  155.       {                                                        /* bloecke */
  156.         lnkpoi->state = lnkpoi->rcvd = lnkpoi->tosend = NULL;  /* initia- */
  157.         inithd(&lnkpoi->rcvdil);                               /* lisier- */
  158.         inithd(&lnkpoi->sendil);                               /* en      */
  159.         inilbl();
  160.         reslnk(); /* damit L-Kommando nach Kaltstart im Hostmode richtig  */
  161.       }
  162. #ifdef STATSCMD
  163.     actbp = l2stats;
  164.     for(n=sizeof(l2stats);n != 0; n--)
  165.         *actbp++ = 0;
  166. /*
  167.     for( n = 0; n < NUMPORTS*2; n++ )
  168.       for( i=0; i<NUML2STATS; i++ )
  169.         l2stats[i][n] = 0;   */           /* clear all level 2 stats */
  170. #endif
  171.   }
  172.  
  173.  
  174.  
  175.  
  176.  
  177. /**************************************************************************\
  178. *                                                                          *
  179. * "send frame reject"                                                      *
  180. *                                                                          *
  181. * Wenn Linkzustand des aktuellen Linkblocks (lnkpoi) nicht Disconnectet/   *
  182. * Linksetup/Disconnectrequest/Framereject ist, FRMR-Zustand einnehmen      *
  183. * (state), FRMR den hoeheren Leveln melden, FRMR-Infobytes aufbauen mit    *
  184. * den Flags ZYXW und merken im Linkblock (frmr), FRACK-Timer abschalten,   *
  185. * FRMR senden.                                                             *
  186. *                                                                          *
  187. \**************************************************************************/
  188.  
  189. VOID sdfrmr(ZYXW)
  190.  
  191. char ZYXW;
  192.  
  193.   {
  194.     register char *frmrip;             /* Zeiger in Linkblock-FRMR-Infobytes       */
  195.     
  196.     if (lnkpoi->state >= L2SIXFER)           /* nur ausfuehren, wenn s.o. */
  197.       {
  198.         frmrip = lnkpoi->frmr;               /* Zeiger auf FRMR-Infobytes */
  199.         *frmrip++ = rxfctl | rxfPF;          /* die FRMR-Infobytes        */
  200.         *frmrip++ =   lnkpoi->VR << 5        /* aufbauen                  */
  201.                     | (!rxfCR ? 0x10 : 0)
  202.                     | lnkpoi->VS << 1;
  203.         *frmrip   = ZYXW;
  204.         lnkpoi->state = L2SFRREJ;            /* Linkzustand: Framereject  */
  205.         clrT1();                             /* FRACK-Timer abschalten    */
  206.         l2tolx(L2MFRMRT);                    /* FRMR melden               */
  207.         xfrmr();                             /* FRMR aussenden            */
  208.       }
  209.   }
  210.  
  211.  
  212.  
  213.  
  214.  
  215. /**************************************************************************\
  216. *                                                                          *
  217. * FRMR senden mit den im aktuellen Linkblock (lnkpoi) gegebenen            *
  218. * Parametern (frmr). Die txf...-Parameter muessen gesetzt sein bis auf     *
  219. * txfctl.                                                                  *
  220. *                                                                          *
  221. \**************************************************************************/
  222.  
  223. VOID xfrmr()
  224.   {
  225.     register char     *frmrip;         /* Zeiger in Linkblock-FRMR-Infobytes       */
  226.     register MBHEAD   *fbp;            /* Framemessageheader fuer Frameaufbau      */
  227.     
  228.     txfctl = L2CFRMR;                   /* FRMR-Frame !                   */
  229.     fbp = makfhd(L2FUS | L2FT1ST);      /* Buffer holen, Framekopf bauen  */
  230.     frmrip = lnkpoi->frmr;              /* Zeiger auf FRMR-Infobytes      */
  231.     putchr(*frmrip++,fbp);              /* FRMR-Infobytes in Frame        */
  232.     putchr(*frmrip++,fbp);
  233.     putchr(*frmrip  ,fbp);
  234.     sdl2fr(fbp);                        /* Frame aussenden                */
  235.   }
  236.  
  237.  
  238.  
  239. /* Ende von L2E.C */
  240.  
  241.